package co.edu.uniquindio.ondas.daos;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import co.edu.uniquindio.ondas.dtos.ResumenConsultaDTO;
import co.edu.uniquindio.ondas.entidades.Consulta;
/**
 * @version 1.0
 * @author Javier
 * 
 * Session Bean implementation class ConsultaDAO
 * 
 * @param Bitacora5DAOhace referencia a la entidad que va hacer manejada por el DAO.
 * @param Long especifica cual es el tipo de dato de la llave primaria de la entidad. 
 */
public class ConsultaDAO extends DAO<Consulta, Long>{

	/**
	 * Manejador de la persistencia
	 */
	private EntityManager entityManager;
	/**
	 * Metodo constructor 
	 *@param entityManager
	 */
	public ConsultaDAO(EntityManager entityManager) {
		super(entityManager);
		this.entityManager=entityManager;
	}

	@Override
	protected Class<Consulta> getEntityClass() {
		// TODO Auto-generated method stub
		return Consulta.class;
	}
	
	/**
	 * Metodo que permite consultar y obtener las consultas por investigacion dada su identificador
	 * @param idInvestigacion
	 * @return Lista de consultas por Investigacion
	 */
	@SuppressWarnings("unchecked")
	public List<Consulta> obtenerConsultasInvestigacion(long idInvestigacion)
	{
		Query query=entityManager.createQuery("SELECT c FROM Consulta c WHERE c.investigacion.identificacion=:parametro");
		query.setParameter("parametro", idInvestigacion);
		return query.getResultList();
	}
	
	/**
	 * Metodo que permite consultar y obtener un numero de consultas por Investigacion dada su identificacion
	 * @param idInvestigacion
	 * @return numero de Consultas
	 */
	public long obtenerNumeroConsultasInvestigacion(long idInvestigacion)
	{
		Query query=entityManager.createQuery("SELECT COUNT (c) FROM Consulta c WHERE c.investigacion.identificacion=:parametro");
		query.setParameter("parametro", idInvestigacion);
		return (Long) query.getSingleResult();
	}
	
	/**
	 * Metodo que permite consultar y obtener un listado de las Consultas realizadas a un Asesor dada la identificacion del Asesor
	 * @param idAsesor
	 * @return Listado de Consultas hechas a un Asesor
	 */
	@SuppressWarnings("unchecked")
	public List<ResumenConsultaDTO> obtenerConsultasAsesor(String idAsesor)
	{
		Query query=entityManager.createQuery("SELECT new co.edu.uniquindio.ondas.dtos.ResumenConsultaDTO(c.Identificacion, c.tema, c.consulta, c.investigacion.nombre, c.investigacion.grupo.nombre, c.investigacion.grupo.sede.nombre, c.investigacion.grupo.sede.institucion.municipio.nombre) FROM Consulta c WHERE c.investigacion.asesor.identificacion=:parametro AND c.administrador= '0'");
		query.setParameter("parametro", idAsesor);
		return query.getResultList();
	}
	
	/**
	 * Metodo que permite consultar y obtener las lista consultas hechas a Un Administrador
	 * @return Lista de consultas Hechas a un Administrador
	 */
	@SuppressWarnings("unchecked")
	public List<ResumenConsultaDTO> obtenerConsultasAdministrador()
	{
		Query query=entityManager.createQuery("SELECT new co.edu.uniquindio.ondas.dtos.ResumenConsultaDTO(c.Identificacion, c.tema, c.consulta, c.investigacion.nombre, c.investigacion.grupo.nombre, c.investigacion.grupo.sede.nombre, c.investigacion.grupo.sede.institucion.municipio.nombre) FROM Consulta c WHERE c.administrador= '1' AND c.contestada= '0'");
		return query.getResultList();
	}

}
